 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  logger_manager, hecho por Ignacio Lucas
 *
 *  Interfaz para acceder al log desde distintos modulos de la aplicacion.
 *  Administra 4 loggers: 1 para los workers, otro para el modulo jobs_controller, otro para el main de la aplicacion y otro para el modulo io_handler.
 *
 *
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 */
#if !defined(MASHUP_SERVER_LOGGER_H)
#define MASHUP_SERVER_LOGGER_H

#include <zlog.h>

// instancias de loggers propios del sistema.
extern zlog_category_t *core_category;
extern zlog_category_t *io_category;
extern zlog_category_t *workers_category;
extern zlog_category_t *app_category;



typedef void *logger_category_t;

// inicializacion del logger_manager.
int logger_init(const char *config);

// registra el identificador de un worker para poder loguear su id.
int logger_register_worker(char *id);

// obtencion de una categoria para poder usarla en las funciones de log.
logger_category_t logger_get_category(char *name);

// Para ser usado por la aplicacion para loguear en alguna categoría específica (no "app").
// Para usar la categoría app, usar las funciones logger_app_*
#define logger_fatal(cat,...) do{zlog_fatal(cat, __VA_ARGS__);}while(0);
#define logger_error(cat,...) do{zlog_error(cat, __VA_ARGS__);}while(0);
#define logger_warn(cat,...) do{zlog_warn(cat, __VA_ARGS__);}while(0);
#define logger_notice(cat,...) do{zlog_notice(cat, __VA_ARGS__);}while(0);
#define logger_info(cat,...) do{zlog_info(cat, __VA_ARGS__);}while(0);
#define logger_debug(cat,...) do{zlog_debug(cat, __VA_ARGS__);}while(0);

// Para ser usado por el core del sistema.
#define logger_core_fatal(fmt,...) do{logger_fatal(core_category,fmt,__VA_ARGS__);}while(0);
#define logger_core_error(fmt,...) do{logger_error(core_category,fmt,__VA_ARGS__);}while(0);
#define logger_core_warn(fmt,...) do{logger_warn(core_category,fmt,__VA_ARGS__);}while(0);
#define logger_core_notice(fmt,...) do{logger_notice(core_category,fmt,__VA_ARGS__);}while(0);
#define logger_core_info(fmt,...) do{logger_info(core_category,fmt,__VA_ARGS__);}while(0);
#define logger_core_debug(fmt,...) do{logger_debug(core_category,fmt,__VA_ARGS__);}while(0);

// Para ser usado por el módulo I/O del sistema.
#define logger_io_fatal(fmt,...) do{logger_fatal(io_category,fmt,__VA_ARGS__);}while(0);
#define logger_io_error(fmt,...) do{logger_error(io_category,fmt,__VA_ARGS__);}while(0);
#define logger_io_warn(fmt,...) do{logger_warn(io_category,fmt,__VA_ARGS__);}while(0);
#define logger_io_notice(fmt,...) do{logger_notice(io_category,fmt,__VA_ARGS__);}while(0);
#define logger_io_info(fmt,...) do{logger_info(io_category,fmt,__VA_ARGS__);}while(0);
#define logger_io_debug(fmt,...) do{logger_debug(io_category,fmt,__VA_ARGS__);}while(0);

// Para ser usado por el módulo core workers del sistema.
#define logger_workers_fatal(fmt,...) do{logger_fatal(workers_category,fmt,__VA_ARGS__);}while(0);
#define logger_workers_error(fmt,...) do{logger_error(workers_category,fmt,__VA_ARGS__);}while(0);
#define logger_workers_warn(fmt,...) do{logger_warn(workers_category,fmt,__VA_ARGS__);}while(0);
#define logger_workers_notice(fmt,...) do{logger_notice(workers_category,fmt,__VA_ARGS__);}while(0);
#define logger_workers_info(fmt,...) do{logger_info(workers_category,fmt,__VA_ARGS__);}while(0);
#define logger_workers_debug(fmt,...) do{logger_debug(workers_category,fmt,__VA_ARGS__);}while(0);

// Para ser usado por la aplicacion (solo si se define la categoria "app" en el archivo de configuracion del log).
#define logger_app_fatal(fmt,...) do{logger_fatal(app_category,fmt,__VA_ARGS__);}while(0);
#define logger_app_error(fmt,...) do{logger_error(app_category,fmt,__VA_ARGS__);}while(0);
#define logger_app_warn(fmt,...) do{logger_warn(app_category,fmt,__VA_ARGS__);}while(0);
#define logger_app_notice(fmt,...) do{logger_notice(app_category,fmt,__VA_ARGS__);}while(0);
#define logger_app_info(fmt,...) do{logger_info(app_category,fmt,__VA_ARGS__);}while(0);
#define logger_app_debug(fmt,...) do{logger_debug(app_category,fmt,__VA_ARGS__);}while(0);

// finalizacion del logger.
int logger_destroy(void);

#endif
